home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Whiteline: delta
/
whiteline CD Series - delta.iso
/
progtool
/
c
/
egem_210
/
egem
/
source
/
objcedit.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-11-25
|
23KB
|
1,060 lines
#ifndef SMALL_EGEM
#include "proto.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifndef __MINT_LIB__
#include <stdlib.h>
#endif
static char string_0[] = "ASCII-Table";
static char string_1[] = " \x01" "\x02" "\x03" "\x04" "\x05" "\x06" "\x07" "\x08" "\x09" "\x0a" "\x0b" "\x0c" "\x0d" "\x0e" "\x0f" "\x10" "\x11" "\x12" "\x13" "\x14" "\x15" "\x16" "\x17" "\x18" "\x19" "\x1a" "\x1b" "\x1c" "\x1d" "\x1e" "\x1f" "";
static char string_2[] = " !\"#$%&\'()*+,-./0123456789:;<=>?";
static char string_3[] = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
static char string_4[] = "`abcdefghijklmnopqrstuvwxyz{|}~\x7f" "";
static char string_5[] = "\x80" "ü\x82" "\x83" "ä\x85" "\x86" "\x87" "\x88" "\x89" "\x8a" "\x8b" "\x8c" "\x8d" "Ä\x8f" "\x90" "\x91" "\x92" "\x93" "ö\x95" "\x96" "\x97" "\x98" "ÖÜ\x9b" "\x9c" "\x9d" "ß\x9f" "";
static char string_6[] = "\xa0" "\xa1" "\xa2" "\xa3" "\xa4" "\xa5" "\xa6" "\xa7" "\xa8" "\xa9" "\xaa" "\xab" "\xac" "\xad" "\xae" "\xaf" "\xb0" "\xb1" "\xb2" "\xb3" "\xb4" "\xb5" "\xb6" "\xb7" "\xb8" "\xb9" "\xba" "\xbb" "\xbc" "\xbd" "\xbe" "\xbf" "";
static char string_7[] = "\xc0" "\xc1" "\xc2" "\xc3" "\xc4" "\xc5" "\xc6" "\xc7" "\xc8" "\xc9" "\xca" "\xcb" "\xcc" "\xcd" "\xce" "\xcf" "\xd0" "\xd1" "\xd2" "\xd3" "\xd4" "\xd5" "\xd6" "\xd7" "\xd8" "\xd9" "\xda" "\xdb" "\xdc" "\xdd" "\xde" "\xdf" "";
static char string_8[] = "\xe0" "\xe1" "\xe2" "\xe3" "\xe4" "\xe5" "\xe6" "\xe7" "\xe8" "\xe9" "\xea" "\xeb" "\xec" "\xed" "\xee" "\xef" "\xf0" "\xf1" "\xf2" "\xf3" "\xf4" "\xf5" "\xf6" "\xf7" "\xf8" "\xf9" "\xfa" "\xfb" "\xfc" "\xfd" "\xfe" "\xff" "";
static char string_9[] = "Cancel";
static TEDINFO ascii_title =
{ string_0, "", "", IBM, 0, TE_CNTR, 0x1180, 0, -1, 11, 1};
static OBJECT ascii_tree[] = {
{ -1, 1, 13, G_BOX, NONE, OUTLINED,CAST (0x21141L), 0,512, 36,14 },
{ 11, 2, 10, G_BOX, NONE, NORMAL,CAST (0xFF1101L), 2,3073, 32,777 },
{ 3, -1, -1, (HEADER<<8)+G_BOXTEXT, NONE, NORMAL,CAST &ascii_title, 1,0, 13,1 },
{ 4, -1, -1, G_STRING, TOUCHEXIT, NORMAL,CAST string_1, 0,1, 32,1 },
{ 5, -1, -1, G_STRING, TOUCHEXIT, NORMAL,CAST string_2, 0,2, 32,1 },
{ 6, -1, -1, G_STRING, TOUCHEXIT, NORMAL,CAST string_3, 0,3, 32,1 },
{ 7, -1, -1, G_STRING, TOUCHEXIT, NORMAL,CAST string_4, 0,4, 32,1 },
{ 8, -1, -1, G_STRING, TOUCHEXIT, NORMAL,CAST string_5, 0,5, 32,1 },
{ 9, -1, -1, G_STRING, TOUCHEXIT, NORMAL,CAST string_6, 0,6, 32,1 },
{ 10,-1, -1, G_STRING, TOUCHEXIT, NORMAL,CAST string_7, 0,7, 32,1 },
{ 1, -1, -1, G_STRING, TOUCHEXIT, NORMAL,CAST string_8, 0,8, 32,1 },
{ 13, 12, 12, G_BUTTON, SELECTABLE|DEFAULT|EXIT, NORMAL,CAST string_9, 22,3851, 12,1025 },
{ 11, -1, -1, (HOTKEY<<8)+G_IBOX, NONE, NORMAL,CAST (0x43011100L), 3,512, 1,1 },
{ 0, -1, -1, (FLYDIAL<<8)+G_IBOX, SELECTABLE|LASTOB, NORMAL,CAST (0x57011100L), 34,0, 2,1 },
};
#define ASC0 3
#define CANCEL 11
#define HISTORY 20
static char history[HISTORY][MAX_EDIT];
static int hist_index;
static char umlaute[] = "_äöüÄÖÜß";
static int insert_char(DIAINFO *info,int scan);
static void delete_char(DIAINFO *info,int index);
static void insert_string(DIAINFO *info,char *str);
char *_edit_get_info(OBJECT *tree,int obj,int index,EDINFO *ed)
{
reg OBJECT *obptr;
reg TEDINFO *ted;
reg char *edit,*masc,c,u='_';
reg int x,idx,width,pxy[4];
if (obj<=0 || index<0)
return (NULL);
obptr = &tree[obj];
ted = obptr->ob_spec.tedinfo;
switch (ted->te_font)
{
case SMALL:
ed->cw = gr_sw;
ed->ch = gr_sh;
break;
case IBM:
ed->cw = gr_cw;
ed->ch = gr_ch;
break;
default:
v_set_text(ted->te_fontid,-ted->te_fontsize,FAIL,pxy);
ed->cw = pxy[0];
ed->ch = pxy[1];
}
ed->text = ted->te_ptext;
ed->masc = masc = ted->te_ptmplt;
ed->valid = ted->te_pvalid;
width = (int) strlen(masc);
width *= ed->cw;
objc_offset(tree,obj,&ed->text_x,&ed->text_y);
ed->text_y += (obptr->ob_height - ed->ch)>>1;
ed->text_w = width;
ed->text_h = ed->ch;
switch(ted->te_just)
{
case TE_RIGHT:
ed->text_x += obptr->ob_width-width;
break;
case TE_CNTR:
ed->text_x += (obptr->ob_width-width)>>1;
break;
}
ed->edit_x = ed->text_x;
ed->edit_y = ed->text_y;
ed->edit_w = 0;
ed->edit_h = ed->text_h;
while (*masc && *masc++!=u)
ed->edit_x += ed->cw;
masc--;
edit = masc;
width = 0;
while (*masc!='\0')
{
width += ed->cw;
if (*masc++==u)
ed->edit_w = width;
}
x = ed->crs_x = ed->edit_x;
ed->crs_y = ed->edit_y;
idx = 0;
masc = edit;
while ((c=*masc++)!='\0')
{
if (c==u)
{
ed->crs_x = x;
if (idx>=index)
break;
else
{
ed->crs_x = (x += ed->cw);
idx++;
}
}
else
x += ed->cw;
}
return (edit);
}
static void draw_cursor(DIAINFO *info,EDINFO *ed)
{
GRECT cursor,work;
_calc_cursor(info,ed,&cursor);
if (rc_intersect(&desk,&cursor))
{
if (info->di_flag>=WINDOW)
{
window_first(info->di_win,&work);
while (work.g_w>0 && work.g_h>0)
{
if (rc_intersect(&cursor,&work))
rc_sc_invert(&work);
window_next(info->di_win,&work);
}
}
else if (info->di_flag>CLOSED)
rc_sc_invert(&cursor);
}
}
void _calc_cursor(DIAINFO *info,reg EDINFO *ed,reg GRECT *cursor)
{
cursor->g_x = ed->crs_x;
cursor->g_y = ed->crs_y;
if (info->di_insert)
{
cursor->g_y -= 1;
cursor->g_w = 1;
cursor->g_h = ed->ch+2;
}
else
{
cursor->g_w = ed->cw;
cursor->g_h = ed->ch;
}
}
static EDINFO ed;
EDINFO *_cursor_off(DIAINFO *info)
{
if (_edit_get_info(info->di_tree,info->di_ed_obj,info->di_ed_index,&ed)!=NULL)
{
if (!info->di_win->iconified && info->di_cursor)
{
if (info->di_flag>=WINDOW)
wind_update(BEG_UPDATE);
MouseOff();
draw_cursor(info,&ed);
MouseOn();
if (info->di_flag>=WINDOW)
wind_update(END_UPDATE);
}
info->di_cursor = FALSE;
return (&ed);
}
else
return (NULL);
}
static int get_editlen(DIAINFO *info)
{
reg char *masc = info->di_tree[info->di_ed_obj].ob_spec.tedinfo->te_ptmplt, u = '_', c;
reg int len = 0;
while ((c=*masc++)!='\0')
if (c==u) len++;
return (len);
}
void _set_cursor(DIAINFO *info,int obj,int index)
{
reg char *text;
reg int new_ob;
if (obj<0)
obj = info->di_ed_obj;
if (info->di_win->iconified || obj<0)
{
info->di_cursor = FALSE;
return;
}
text = info->di_tree[obj].ob_spec.tedinfo->te_ptext;
if (index<0 && (index=info->di_ed_index)<0)
index = (int) strlen(text);
else
index = max(min(index,(int) strlen(text)),0);
new_ob = (obj!=info->di_ed_obj);
if (new_ob || index!=info->di_ed_index || info->di_cursor==FALSE)
{
if (new_ob)
_insert_history(info);
if (info->di_flag>=WINDOW)
wind_update(BEG_UPDATE);
MouseOff();
if (info->di_cursor)
{
_edit_get_info(info->di_tree,info->di_ed_obj,info->di_ed_index,&ed);
draw_cursor(info,&ed);
info->di_cursor = FALSE;
}
info->di_ed_obj = obj;
if (info->di_insert==FALSE)
index = min(index,get_editlen(info)-1);
info->di_ed_index = index;
if (info->di_drawn)
{
_edit_get_info(info->di_tree,obj,index,&ed);
draw_cursor(info,&ed);
info->di_cursor = TRUE;
}
MouseOn();
if (info->di_flag>=WINDOW)
wind_update(END_UPDATE);
if (new_ob)
strncpy(info->di_undobuff,ob_get_text(info->di_tree,info->di_ed_obj,0),MAX_EDIT-1);
}
}
static void first_edit(DIAINFO *info)
{
reg OBJECT *obj = info->di_tree;
reg int index= 0;
if (info->di_ed_cnt<=1)
return;
do
{
obj++;index++;
if ((obj->ob_flags & EDITABLE) && !_is_hidden(info->di_tree,index))
{
_set_cursor(info,index,0);
break;
}
}
while (!(obj->ob_flags & LASTOB));
}
static void last_edit(DIAINFO *info)
{
reg OBJECT *obj = info->di_tree;
reg int index,last;
if (info->di_ed_cnt<=1)
return;
index = last = 0;
do
{
obj++;index++;
if ((obj->ob_flags & EDITABLE) && !_is_hidden(info->di_tree,index))
last = index;
}
while (!(obj->ob_flags & LASTOB));
if (last)
_set_cursor(info,last,0x1000);
}
int _next_edit(DIAINFO *info,int first)
{
reg int index = info->di_ed_obj;
reg OBJECT *obj = &info->di_tree[index];
if (info->di_ed_cnt<=1)
return(FALSE);
if (!(obj->ob_flags & LASTOB))
{
do
{
obj++;index++;
if ((obj->ob_flags & EDITABLE) && !_is_hidden(info->di_tree,index))
{
_set_cursor(info,index,0x1000);
return(TRUE);
}
}
while (!(obj->ob_flags & LASTOB));
}
if (first)
{
first_edit(info);
_set_cursor(info,FAIL,0x1000);
return (TRUE);
}
else
return (FALSE);
}
static void prev_edit(DIAINFO *info)
{
reg int index = info->di_ed_obj;
reg OBJECT *obj = &info->di_tree[index];
if (info->di_ed_cnt<=1)
return;
do
{
obj--;index--;
if ((obj->ob_flags & EDITABLE) && !_is_hidden(info->di_tree,index))
{
_set_cursor(info,index,0x1000);
return;
}
} while (index>0);
last_edit(info);
}
static int cursor_handler(DIAINFO *info,int state,int scan,XEVENT *event)
{
reg char *text = ob_get_text(info->di_tree,info->di_ed_obj,0);
reg int ascii;
if (!(state & K_CTRL))
{
if (state & 3)
{
switch(scan)
{
case SCANESC:
first_edit(info);
insert_string(info,"");
while (_next_edit(info,FALSE))
insert_string(info,"");
first_edit(info);
_send_msg(info,FAIL,OBJC_EDITED,0,0);
info->di_taken = FAIL;
break;
case SCANBS:
if (info->di_ed_index>0)
{
_cursor_off(info);
strcpy(text,&text[info->di_ed_index]);
ob_draw(info,info->di_ed_obj);
_set_cursor(info,FAIL,0);
}
break;
case SCANDEL:
_cursor_off(info);
text[info->di_ed_index] = '\0';
ob_draw(info,info->di_ed_obj);
_set_cursor(info,FAIL,FAIL);
break;
case SCANRET:
case SCANENTER:
case SCANTAB:
prev_edit(info);
break;
case SCANUP:
first_edit(info);
break;
case SCANHOME:
last_edit(info);
break;
case SCANDOWN:
last_edit(info);
case SCANLEFT:
_set_cursor(info,FAIL,0);
break;
case SCANRIGHT:
_set_cursor(info,FAIL,0x1000);
break;
case SCANINS:
ascii = ascii_box(info->di_title);
_init_xformdo(event,NULL,FAIL);
if (ascii)
insert_char(info,ascii);
break;
default:
return(FALSE);
}
}
else
{
switch(scan)
{
case SCANESC:
insert_string(info,"");
break;
case SCANBS:
if (info->di_ed_index>0)
delete_char(info,info->di_ed_index-1);
break;
case SCANDEL:
delete_char(info,info->di_ed_index);
break;
case SCANHOME:
first_edit(info);
break;
case SCANUP:
prev_edit(info);
break;
case SCANDOWN:
case SCANTAB:
case SCANENTER:
_next_edit(info,TRUE);
break;
case SCANINS:
_cursor_off(info);
info->di_insert = (info->di_insert) ? FALSE : TRUE;
_set_cursor(info,FAIL,FAIL);
break;
case SCANLEFT:
_set_cursor(info,FAIL,max(info->di_ed_index-1,0));
break;
case SCANRIGHT:
_set_cursor(info,FAIL,info->di_ed_index+1);
break;
default:
return(FALSE);
}
}
return(TRUE);
}
else
return(FALSE);
}
static char ted_char(char valid, reg unsigned char c)
{
switch (valid)
{
case 'l':
case 'L':
if (c>=16 && c<=25)
return (c);
else if (c>='0' && c<='9')
return (c - '0' + 16);
break;
case 'c':
case 'C':
if (strchr(".+-*/^()[]{}",c))
return (c);
else if (c==',')
return ('.');
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (c>='0' && c<=valid)
return (c);
break;
case 'h':
c = LowerChar(c);
if ((c>='0' && c<='9') || (c>='a' && c<='f'))
return (c);
break;
case 'H':
c = UpperChar(c);
if ((c>='0' && c<='9') || (c>='A' && c<='F'))
return (c);
break;
case 'N':
if (c>='0' && c<='9')
return (c);
case 'A':
c = UpperChar(c);
if ((c>='A' && c<='Z') || c==' ')
return (c);
break;
case 'n':
if (c>='0' && c<='9')
return (c);
case 'a':
c = LowerChar(c);
if ((c>='a' && c<='z') || c==' ')
return (c);
break;
case 'P':
if (c=='\?' || c=='*')
return (c);
case 'p':
if (c=='.' || c==':' || c=='\\')
return (c);
case 'F':
if ((c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9') || strchr(" _!@#$%^&()+-=~\'`;\",<>|[]{}",c))
return (c);
break;
case 'U':
c = UpperChar(c);
if (c>=32 && c<=127)
return (c);
break;
case 'u':
c = LowerChar(c);
if (c>=32 && c<=127)
return (c);
break;
case 'V':
c = UpperChar(c);
if (c>=32)
return (c);
break;
case 'v':
c = LowerChar(c);
if (c>=32)
return (c);
break;
case 'w':
case 'W':
if (c>=32 && c<=127)
return (c);
break;
case 'y':
case 'Y':
if (c>=32)
return (c);
break;
case 'X':
default:
return (c);
}
return ('\0');
}
static void insert_string(DIAINFO *info,char *str)
{
reg TEDINFO *ted = info->di_tree[info->di_ed_obj].ob_spec.tedinfo;
reg char c,v,*text = ted->te_ptext,*valid = ted->te_pvalid;
reg int len = get_editlen(info);
_cursor_off(info);
v = *valid++;
while (len>0 && *str!='\0')
if ((c=ted_char(v,*str++))!='\0')
{
*text++ = c;
if (*valid)
v = *valid++;
len--;
}
*text = '\0';
ob_draw(info,info->di_ed_obj);
_set_cursor(info,FAIL,0x1000);
}
static void new_edit(DIAINFO *info, char *new, char *text, char *edit,int index, int len)
{
char new_text[MAX_EDIT<<1],old_text[MAX_EDIT<<1];
reg EDINFO *ed;
reg char m,*s,*c,*n,*o;
reg int offset,width;
int len1,len2;
if (strcmp(new,text))
{
n = new_text; o = old_text;
s = new; c = text;
while ((m=*edit++)!='\0')
if (m=='_')
{
*n++ = *s++;
*o++ = *c++;
}
else
*n++ = *o++ = m;
s = new_text; c = old_text;
while (*s++==*c++);
s--;c--;
offset = (int) (s-new_text);
len1 = (int) strlen(s);
len2 = (int) strlen(c);
if (len1!=len2)
width = max(len1,len2);
else
{
width = len1;
s += len1; c += len1;
while (*--s==*--c)
width--;
}
strncpy(text,new,len);
ed = _cursor_off(info);
ed->text_x += offset*ed->cw;
ed->text_w = width*ed->cw;
ob_draw_chg(info,info->di_ed_obj,(GRECT *) &ed->text_x,FAIL,FALSE);
}
_set_cursor(info,FAIL,index);
}
static void delete_char(DIAINFO *info,int index)
{
char buf[MAX_EDIT<<1];
reg TEDINFO *ted = info->di_tree[info->di_ed_obj].ob_spec.tedinfo;
reg char *text = ted->te_ptext;
if (text[index]!='\0')
{
strcpy(buf,text);
strcpy(&buf[index],&text[index+1]);
new_edit(info,buf,text,ted->te_ptmplt,index,get_editlen(info));
}
}
static int insert_char(DIAINFO *info,int scan)
{
char buf[MAX_EDIT<<1];
reg TEDINFO *ted = info->di_tree[info->di_ed_obj].ob_spec.tedinfo;
reg char v,*text = ted->te_ptext,*valid = ted->te_pvalid;
reg int idx,offset,taken;
offset = idx = min(get_editlen(info)-1,info->di_ed_index);
while (idx>=0 && *valid)
{
v = *valid++;
idx--;
}
if ((taken=ted_char(v,scan))!=0)
{
strcpy(buf,text);
if (info->di_insert)
strcpy(&buf[offset+1],text+offset);
else
{
valid = buf;
while (*valid++);
*valid++ = '\0';
}
buf[offset] = taken;
new_edit(info,buf,text,ted->te_ptmplt,info->di_ed_index+1,get_editlen(info));
return (TRUE);
}
else
return (FALSE);
}
void _insert_history(DIAINFO *info)
{
reg char *str;
if (info->di_ed_obj<=0)
return;
str = ob_get_text(info->di_tree,info->di_ed_obj,0);
if (str!=NULL && *str!='\0')
{
reg int i;
for (i=0;i<HISTORY-1;i++)
if (!strcmp(history[i],str))
return;
for (i=(HISTORY-1);i>=1;i--)
strcpy(history[i],history[i-1]);
strcpy(history[0],str);
if (hist_index<(HISTORY-1) && history[hist_index+1][0])
hist_index++;
}
}
static boolean clipbrd_save(DIAINFO *info,int mode)
{
char path[MAX_PATH],*text,*crlf="\r\n";
int handle;
if (scrp_path(path,"scrap.txt") && (handle=open(path,mode))>0)
{
text = ob_get_text(info->di_tree,info->di_ed_obj,0);
#ifdef __MINT_LIB__
write(handle,text,(unsigned) strlen(text));
write(handle,crlf,2);
#else
write(handle,text,strlen(text));
write(handle,crlf,2);
#endif
close(handle);
scrp_changed(SCF_TEXT,0x2e545854l); /* .TXT */
return(TRUE);
}
else
return(FALSE);
}
int _insert_buf(DIAINFO *info,char *text,int cat)
{
char buf[MAX_EDIT];
reg char *line;
reg int len = 0;
strncpy(buf,text,MAX_EDIT-1);
buf[MAX_EDIT-1] = '\0';
if ((line=strpbrk(buf,"\r\n"))!=NULL)
{
len = (line[0]=='\r' && line[1]=='\n') ? 2 : 1;
*line = '\0';
}
len += (int) strlen(buf);
if (cat)
{
char str[MAX_EDIT<<1];
strcpy(str,ob_get_text(info->di_tree,info->di_ed_obj,0));
strcat(str,buf);
strncpy(buf,str,MAX_EDIT-1);
buf[MAX_EDIT-1] = '\0';
}
insert_string(info,buf);
return (len);
}
static void clipbrd_load(DIAINFO *info,boolean flag)
{
char path[MAX_PATH],buf[MAX_EDIT];
int handle;
if (scrp_path(path,"scrap.txt") && (handle=open(path,O_RDONLY))>0)
{
if (read(handle,buf,MAX_EDIT-1)>0);
_insert_buf(info,buf,flag);
close(handle);
}
}
static boolean word_char(char c)
{
if (c)
if (isalnum(c) || strchr(umlaute,c)!=NULL)
return(TRUE);
return(FALSE);
}
static int insert_point(DIAINFO *info,char ascii)
{
char edit_buf[MAX_EDIT];
reg TEDINFO *ted = info->di_tree[info->di_ed_obj].ob_spec.tedinfo;
reg char *masc = ted->te_ptmplt,*edit,c;
reg int idx = info->di_ed_index;
edit = strcpy(edit_buf,ted->te_ptext);
while (*masc!='\0' && *masc++!='_');
masc--;
if (strchr(",.;:/\\|",ascii)!=NULL && strchr(masc,ascii)!=NULL)
{
while (idx>0)
if (*masc++=='_')
{
idx--;
edit++;
}
while (*masc++!='_');
masc--;
if (strchr(masc,ascii)!=NULL)
{
while ((c=*masc++)!='\0')
if (c==ascii)
break;
else if (c=='_')
*edit++ = ' ';
*edit++ = '\0';
insert_string(info,edit_buf);
}
info->di_taken = TRUE;
return (TRUE);
}
else
return (FALSE);
}
static int value[] = {7,8,9,4,5,6,1,2,3,0};
int _objc_edit_handler(DIAINFO *info,int state,int scan,XEVENT *event,int *edited)
{
reg int old_obj = info->di_ed_obj;
reg int sn = (int) (((unsigned) scan)>>8),shft = (state&3);
reg char old_edit[MAX_EDIT],*text = ob_get_text(info->di_tree,old_obj,0);
strcpy(old_edit,text);
info->di_taken = TRUE;
if (cursor_handler(info,state,sn,event)==FALSE)
{
if (sn==SCANUNDO)
insert_string(info,info->di_undobuff);
else if ((state & K_ALT) && (sn>=0x67 && sn<=0x70))
{
_ascii *= 10;
_ascii += value[sn-0x67];
_ascii_digit++;
if (_ascii_digit==3 || _ascii>=26)
{
insert_char(info,_ascii);
_ascii = _ascii_digit = 0;
}
}
else if (state & K_CTRL)
{
reg char *c = text+info->di_ed_index;
switch (sn)
{
case CTRLLEFT:
while (c>text && word_char(*(--c)));
while (c>text && !word_char(*(--c)));
_set_cursor(info,FAIL,(c>text) ? (int) (c - text + 1) : 0);
break;
case CTRLRIGHT:
while (word_char(*c++));
if (*(--c) != '\0')
{
while (!word_char(*c++));
if (*(--c) != '\0')
_set_cursor(info,FAIL,(int) (c - text));
}
else
_set_cursor(info,FAIL,(int) (c - text));
break;
case SCANUP:
{
int o_i = hist_index;
_insert_history(info);
if (shft)
{
reg size_t n = strlen(text);
if (n)
{
reg int i;
for (i=(hist_index!=o_i) ? 1 : 0;i<HISTORY;i++)
if (!strncmp(history[i],text,n))
{
insert_string(info,history[i]);
hist_index = i;
break;
}
}
}
else
{
if ((hist_index<(HISTORY-1)) && (history[hist_index+1][0]))
hist_index++;
insert_string(info,history[hist_index]);
}
}
break;
case SCANDOWN:
_insert_history(info);
if (shft)
{
reg size_t n = strlen(text);
if (n)
{
reg int i;
for (i=(HISTORY-1);i>=0;i--)
if (!strncmp(history[i],text,n))
{
insert_string(info,history[i]);
hist_index = i;
break;
}
}
}
else
{
if (hist_index>0 && history[hist_index-1][0])
hist_index--;
insert_string(info,history[hist_index]);
}
break;
default:
{
int ascii = scan_2_ascii(scan,state),flag;
switch (ascii)
{
case 'X':
case 'C':
if (shft)
flag = clipbrd_save(info,O_WRONLY|O_APPEND|O_CREAT);
else
{
scrp_clear(0);
flag = clipbrd_save(info,O_WRONLY|O_CREAT);
}
if (flag && ascii=='X')
{
_cursor_off(info);
ob_get_text(info->di_tree,info->di_ed_obj,1);
ob_draw(info,info->di_ed_obj);
_set_cursor(info,FAIL,FAIL);
}
break;
case 'V':
clipbrd_load(info,(shft) ? TRUE : FALSE);
break;
default:
info->di_taken = FALSE;
break;
}
}
break;
}
}
else if (!(state & K_ALT))
{
if (insert_point(info,scan_2_ascii(scan,state))==FALSE)
info->di_taken = insert_char(info,scan);
}
else
info->di_taken = FALSE;
}
if (info->di_taken==FAIL)
*edited = FAIL;
else if (info->di_taken && old_obj==info->di_ed_obj && strcmp(old_edit,text))
*edited = TRUE;
else
*edited = FALSE;
return (FAIL);
}
char ascii_box(char *title)
{
static int fix = TRUE, open = FALSE;
int exit;
if (open)
return (0);
if (fix)
{
rsrc_calc(ascii_tree,SCALING,8,16);
fix = FALSE;
}
open = TRUE;
exit = xdialog(ascii_tree,title,NULL,NULL,TRUE,FALSE,AUTO_DIAL|MODAL|NO_ICONIFY);
open = FALSE;
if (exit>0)
{
if (exit!=CANCEL)
{
int x,ox,d,ascii;
_mouse_pos(&x,&d);
objc_offset(ascii_tree,exit,&ox,&d);
_no_click();
ascii = (exit - ASC0)<<5;
if ((d = x-ox)>=0)
ascii += d/gr_cw;
ascii = min(max(ascii,0),255);
return (ascii);
}
}
return (0);
}
#endif